const queue: any[] = [];
const p = Promise.resolve()
let isFlushPending = false;

export function nextTick(fn){
    return fn ? p.then(fn) : p;
}

export function queueJob(job){
    if(!queue.includes(job)){
        queue.push(job)
        // 执行所以的job
        queueFlush();
    }
}

function queueFlush(){
    // 如果同时触发两个组件的更新的或
    // 这里就会触发两次 then (微任务逻辑)
    // 但是是没有必要的
    // 我们只需要触发一次处理完所有的job调用
    // 所以需要判断一下，如果已经触发过nextTick()
    // 那么后面就不需要再触发一次 nextTick了
    if(isFlushPending) return;
    isFlushPending = true;
    nextTick(flushJobs)
}
function flushJobs(){
    isFlushPending = false;
    let job;
    while((job = queue.shift())){
        if(job){
            job();
        }
    }
}